package cz.fimuni.pa165.backendderby.dao;

import cz.fimuni.pa165.backendderby.entities.Company;
import cz.fimuni.pa165.backendderby.entities.Employee;
import java.util.List;

/**
 *
 * @author Lukáš Slovák
 * @version 1.1
 */
public interface EmployeeDAO {
    
    
    /**
     * Vytvorí v databáze záznam o danom zamestnancovi.
     * 
     * @param employee  zamestnanec, ktorého údaje sa majú uložiť do databázy
     */
    public void create(Employee employee);
    
    
    /**
     * Vyhľadá v databáze zamestnanca s daným id a vráti jeho údaje uložené v
     * objekte triedy Employee. Ak zamestnanec s daným id neexistuje, vráti null.
     * 
     * @param id  id hľadaného zamestnanca.
     * @return    údaje o hľadanom zamestnancovi ako objekt triedy Employee, alebo
     *            null, ak hľadaný zamestnanec neexistuje.
     */
    public Employee get(Long id);
    
    /**
     * vyhľadá v databáze zamestnanca, ktorého id je rovnaké ako id parametru metódy a 
     * upraví jeho údaje tak, aby sa zhodovali s údajmi zamestnanca, ktorý je parametrom 
     * metódy a vráti true. Inak vráti false.
     * 
     * @param employee  zamestnanec, ktorého údaje majú byť upravené
     * @return  true, ak sa podarí upraviť údaje zamestnanca, false inak.
     */
    public boolean update(Employee employee);
    
    /**
     * Odstráni zamestnanca z databázy. Ak sa zamestnanec v databáze nenachádza,
     * metóda neurobí nič.
     * 
     * @param employee zamestnanec, ktorý má byť odstránený
     */    
    public void remove(Employee employee);
    
    /**
     * Vráti zoznam všetkých zamestnancov vo všetkých firmách
     * 
     * @return zoznam všetkých zamestnancov
     */
    public List<Employee> getAllEmployees();
    
    /**
     * Vráti zoznam všetkých zamestnancov s daným priezviskom
     * 
     * @param surname priezvisko, podľa ktorého sa hľadá.
     * @return zoznam zamestnancov s daným priezviskom, inak null
     */
    public List<Employee> findByName(String surname);
    
    /**
     * Vráti zoznam všetkých zamestnancov s daným username
     * 
     * @param username uzivatelske meno, podľa ktorého sa hľadá.
     * @return zoznam zamestnancov s daným uzivatelskym menom, inak null
     */
    public List<Employee> findByUsername(String username);
    
    /**
     * Vráti zoznam všetkých zamestnancov, patriacich do danej firmy.
     * 
     * @param company firma, do ktorej majú zamestnanci patriť
     * @return Zoznam zamestnancov danej firmy, ak firma nemá zamestnancov, vráti
     *         prázdny zoznam, ak firma neexistuje, vráti null
     */    
    public List<Employee> findByCompany(Company company);
    
}
